package com.ssl.hashmap.util;

/**
 * 描述：根据hashmap原理，构造一个简单的hashmap
 *
 * @author ssl
 * @create 2021/4/2 0002.
 */
public class MyHashMap {

// ---------------------------------基础知识点-------------------------- //

    /**
     * 一、JAVA位运算，会自动转换为二进制进行计算
     * 1.1、异或(^)：两个操作数的位中，相同则结果为0，不同则结果为1;
     * 1.2、与(&)：两个操作数中位都为1，结果才为1，否则结果为0;
     * 1.3、或(|)：两个位只要有一个为1，那么结果就是1，否则就为0;
     * 1.4、非(~)：如果位为0，结果是1，如果位为1，结果是0;
     * 二、基本的数据结构介绍
     * 1、数组：采用一段连续的存储单元来存储数据。对于指定下标的查找，时间复杂度为 O(1)，对于插入删除操作，
     *    涉及到元素的移动，其平均复杂度为 O(n);
     * 2、线性链表：对于链表的新增、删除等操作(在找到指定操作位置后)，仅需处理节点间的引用即可，时间复杂度为 O(1)，
     *    而查找需要遍历链表逐一比对，复杂度为 O(n);
     * 3、二叉树：对一颗相对平衡的有序二叉树，对其进行插入、查找、删除等操作，平均复杂度为 O(logn);
     * 4、哈希表：在哈希表中进行添加、删除、查找等操作，性能十分之高，不考虑哈希冲突的情况下，仅需一次定位即可完成，
     *    时间复杂度为 O(1)
     * 三、HashMap简单介绍
     * 1、
     * 2、
     */
// ------------------------------------------------------------------- //

    /**
     * 一个数组中，只有一个数出现了一次，其余都是出现了两次，找出那个出现一次的数
     *
     * @return
     */
    public static int getNum() {
        int[] a = {2, 5, 5, 7, 8, 6, 7, 8, 2};
        int n = 0;
        for (int i : a) {
            n = n ^ i;
        }
        /**
         * n=0^2 n=2
         * n=2^5 n=7
         * n=7^5 n=2
         * n=2^7 n=5
         * n=5^8 n=13
         * n=13^6 n=11
         * n=11^7 n=10
         * n=10^8 n=4
         * n=4^2 n=6
         */
        System.out.println(n);
        return n;
    }
}
